Podemos usar ficheros de recursos de aplicaci�n, par�metros de entorno, propiedades de sistema, y par�metros de applets para especificar propiedades de entorno pero, �qu� pasa si usamos m�s de uno de estos mecanismos a la vez?
�Inicializaci�n
Cuando usamos cualquiera de los constructores de las siguientes clases, podemos suministrar un par�metro Hashtable que contenga propiedades de entorno: InitialContext, InitialDirContext, y InitialLdapContext.
El entorno del contexto inicial es inicializado desde las dos siguientes fuentes, en el orden especificado.
- Par�metro de entorno del constructor. Si la propiedad es una de.
java.naming.factory.initial java.naming.factory.object java.naming.factory.state java.naming.factory.control java.naming.factory.url.pkgs java.naming.provider.url java.naming.dns.url
y no ocurre en el par�metro entorno, se obtiene desde los par�metros del applet, y si no est� presente all�, desde las propiedades del sistema.
- Todos los ficheros de recursos de aplicaci�n (jndi.properties).
Por eso el entorno, efectivamente, es la uni�n de los par�metros de entorno y los ficheros de recursos de aplicaci�n, con la regla adicional de que algunas propiedades est�ndars se podr�an obtener desde par�metros de un applet o desee propiedades del sistema.
Si una de las siguientes propiedades se encuentra en alguno de estos dos recursos o en m�s de un fichero de recursos de aplicaci�n, todos los valores de las propieades se concatenan en una s�la lista separada por dos puntos. Para otras propiedades, se usa el primer valor encontrado.
java.naming.factory.object java.naming.factory.state java.naming.factory.control java.naming.factory.url.pkgs
Cuando se llama al constructor, el JNDI construye un entorno de acuerdo a esas reglas y pasa el resultado al proveedor de servicios subyancente. Cuando se llama a los m�tosos que obtienen objetos del contexto inicial derivados de dicho contexto, como Context.lookup(), se hereda el entorno del contexto padre.
Observa que posiblemente no todas las propiedades de entorno se apliquen a un contexto. Sin embargo, el contexto siempre est� obligado a grabarlas y pasarlas a cualquier contexto derivado.
�Obtener un Entorno de Contexto
Para obtener un entorno de contexto, usamos getEnvironment().
Aqu� tenemos un ejemplo.
// Initial environment with various properties
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.FSContextFactory");
env.put(Context.PROVIDER_URL, "file:/");
env.put(Context.OBJECT_FACTORIES, "foo.bar.ObjFactory");
env.put("foo", "bar");
// Call the constructor
Context ctx = new InitialContext(env);
// See what environment properties you have
System.out.println(ctx.getEnvironment());
Cuando ejecutamos este fichero con el siguiente fichero de recursos de aplicaci�n de nuestro classpath.
java.naming.factory.object=com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url=ldap://localhost:389/o=jnditutorial com.sun.jndi.ldap.netscape.schemaBugs=true
obtenemos los siguientes resultados.
com.sun.jndi.ldap.netscape.schemaBugs=true java.naming.factory.object=foo.bar.ObjFactory:com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory foo=bar java.naming.provider.url=file:/ java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
De esta salida podemos observar lo siguiente.
- Las propiedades que s�lo se encuentran en una fuente --"foo" desde el par�metro de entorno, y "com.sun.jndi.ldap.netscape.schemaBugs" desde el fichero de recursos de aplicaci�n-- est�n en el entorno resultante.
- Las propiedades listas-de-factor�as (es decir, "java.naming.factory.object") que ocurren en ambas fuentes se mezclan, con las de los par�metros de entorno en primera posici�n de las listas.
- Todas las dem�s propiedades (es decir, "java.naming.factory.initial") que ocurren en �mbas fuentes toman sus valores del par�metro de entorno.
Los usuarios muchas veces actualizan err�neamente el resultado de getEnvironment() y luego esperan que el entorno del contexto se actualice adecuadamente.
Dependiendo de la implementaci�n del proveedor, actualizar los resultados de getEnvironment() podr�a no tener efecto. De echo, deber�amos pensar que el resultado de getEnvironment() es un objeto de s�lo lectura inmutable, y no intentar actualizarlo. Pueder ir a la pr�xima secci�n para ver m�s instrucciones sobre como actualizar un entorno de contexto.